/***************************************************************************************************
  Copyright(C)   2011-8-24
  All rights reserved.
  File Name: environment.h

  Description:环境变量模块
              一般公共的宏定义或者结构体就放在此文件内,现在主要是数据库的一些公共结构体

  ***************************************************************************************************/

#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H



#include <QString>
#include <QList>
#include <QDateTime>
#include <QFile>
#include <QMap>
#include <QTimer>
#include <QCoreApplication>

#include "recepkgmanage.h"


//#define SLCD_VERSION            2.2.0
//#define SLCD_VERSION_STR        "2.2.0"

#define SLCD_VERSION            2.3.4
#define SLCD_VERSION_STR        "2.3.4"
#define SLCD_VERSION_TYPE       "beta"

#define ERR01PATH           "./update/err01"                //接收文件是错误数据保存路径
#define ERR02PATH           "./update/err02"                //接收文件是错误数据保存路径

#define FILEPKGSIZE         1000
#define NOTEPATH            "note"                         //服务日记文件路径，也即是客户端可以看到和下载此路径中的所有文件
#define UPDATEPATH          "update/data"                  //接收更新文件的保存路径

#define SQLPATH             "/update/sql"

#define BACKUPRESOURCEPATH  "backup/resource"              //保存最近一次资源文件路径
#define BACKUPDATAPATH      "backup/data"                  //保存最近一次程序的路径


#define PROGRAMNAME         "PISPlayer"                     //服务端的文件名
#define AUXPATH             "/update/auxprogram"            //更新DISPLAYER的辅助程序

#define DEFAULTCONFIGPATH   "data/default"
#define TESTLCDPATH         "data/testlcd"

#define GLOBAL_RESOLUTION_WIDTH         1920
#define GLOBAL_RESOLUTION_HEIGHT        540



//线路信息结构体
typedef struct _ROUTEMSGSTRUCT{
    QString routeCode;
    QString currentStationCode;
    int positionIncar;
    //QString trainStatus;
    int trainStatusID;
} RouteMsgStruct;


//CE浏览route信息结构体
typedef struct CEROUTEMSG{
    int     platSide;               //开门侧,左边:1 或者右边:2
    int     status;                 //状态
    int     routeID;                //线路
    int     directionID;            //
    int     stationID;              //当前站点
    int     destID;                 //目的站
    int     positionIncar;
} CeRouteMsg;


//布局结构体
typedef struct _LAYOUTSTRUCT{
    int layoutID;              //布局编号,只有数据库在添加数据时才会用到
    int partitionID;           //分区编号
    int x;
    int y;
    int height;
    int width;
} LayoutStruct;

//内容结构体
typedef struct _CONTENTSTRUCT{
    int contentID;              //内容编号,只有数据库在添加数据时才会用到
    int order;                  //顺序编号
    int contentTypeID;          //内容类型编号
    QString contentFile;        //文件路径
    int duration;               //持续时间
    bool isHolidayContent;      //是否节假日
    int repeatFlag;             //是否循环播放,只有数据库在添加数据时才会用到
    QString holiday;            //节假日日期,只有数据库在添加数据时才会用到
    bool isUnlimited;           //是否不限制无限播放
} ContentStruct;


//播放包结构体                            //ivan 一个包一个区域，一个区域存在若干个文件.这样一个包在SLCD_T_PackageRelation表中是一项
typedef struct ROUTEPKGSTRUCT{
    int contentTypeID;                       //内容类型编号
    LayoutStruct layoutStruct;               //布局结构体
    //播放内容列表:将平时内容和节假日内容的播放顺序结合成一个列表
    //播放时只需按list顺序播放就可以了
    QList<ContentStruct > contentStructList;
} RoutePkgStruct;

/*
包                   ---- 布局                     ---- 分区             ---- 播放列表

RoutePkgList         ---- QList<RoutePkgStruct>   ---- RoutePkgStruct   ---- QList<ContentStruct>

1个包内包含多个布局，1个布局包含多个分区，1个分区内包含多条播放列表
*/


typedef struct {
    QList<RoutePkgStruct> routePkgList;
    int                   playTime;         //当前布局的播放时间
}   RoutePkgList;

//ivan @2011.09.01 add
//#define CONTENT_HOLIDAY 0       //ivan @2011.10.17 不应该有这种类型
#define CONTENT_MEDIA   1
#define CONTENT_PIC     2
#define CONTENT_TEXT    3
#define CONTENT_FLASH   4
#define CONTENT_PDF     5
#define CONTENT_OnlyShowTxt     6



typedef struct _PKGSTRUCT{
    int pkgID;
    int interval;
}PkgStruct;

//线路信息ID结构体
typedef struct _MAINRELATIONIDSTRUCT{
    int routeID;                //线路ID
    int staionID;               //站点ID
    int trainDirectionID;       //方向ID
    int positionInCarID;        //车厢内位置ID
    int trainStatusID;          //状态ID
    int usrPkgID;               //自定义包ID
    int defaultPkgID;           //默认包ID
    QList<PkgStruct> usrPkgList;
    QList<PkgStruct> defaultPkgList;
} MainRelatIDStruct;


//包关系结构体
typedef struct _PKGRELATSTRUCT{
    int pkgID;
    int layoutID;
    int partitionID;
    int contentID;
    int holidayContentID;
} PkgRelatStruct;


//节假日描述结构体
typedef struct _HOLIDAYDESSTRUCT{
    int holidayContentID;         //节假日内容ID
    QString holidayContentDes;    //节假日内容描述
    int playModeID;               //节假日播放方式ID
} HoliDesStruct;

//节假日播放方式结构体
typedef struct _HOLIDAYPLAYMODELSTRUCT{
    int playModelID;           //节假日播放方式ID
    QString playModelDES;      //节假日播放方式描述
} HoliPlayModStruct;

//节假日描述和播放方式的结构体
typedef struct _HOLIDAYDESMODELSTRUCT{
    HoliDesStruct holiDesStru;                      //节假日描述结构体
    HoliPlayModStruct holiPlayModStruct;            //节假日内容结构体
} HoliDesModStruct;

//节假日信息结构体
typedef struct _HOLIDAYINFOSTRUCT{
    HoliDesModStruct holiDesModStruct;    //节假日描述和播放方式的结构体
    ContentStruct cntStruct;              //节假日内容结构体
} HoliInfoStruct;


//自定义内容描述结构体
typedef struct _USRCONTENTDESSTRUCT{
    int contentID;            //自定义播放内容编号
    QString ContentDes;       //自定义播放内容描述
    int repeatTimes;          //自定义播放播放次数
} UsrCntDesStruct;

//自定义内容播放类型结构体
typedef struct _USRCONTENTTYPESTRUCT{
    int contentTypeID;              //自定义播放内容编号
    QString contentTypeDes;         //自定义播放内容类型描述
} UsrCntTypeStruct;

//自定义播放内容信息结构体
typedef struct _USRINFOSTRUCT{
    UsrCntDesStruct usrCntDesStruct;       //自定义内容描述结构体
    ContentStruct cntStruct;               //内容结构体
    UsrCntTypeStruct usrCntTypeStruct;     //自定义播放内容信息结构体
} UsrInfoStru;


//包定义结构体
typedef struct _PKGDESSTRUCT{
    int pkgID;                  //包ID
    QString pkgDes;             //包描述
} PkgDesStruct;

//列车状态结构体
typedef struct _TRAINSTATUSSTRUCT{
    int trainStatusID;          //列车状态ID
    QString trainStatusDes;     //列车状态描述
} TrainStatusStruct;

//列车线路结构体
typedef struct _ROUTESTRUCT{
    int routeID;                //线程ID
    QString routeName;          //线路名字
//    int trainDirctID;           //线程方向ID
    QString TISRouteCode;       //线程TIScode
} RouteStruct;

//列车站点结构体
typedef struct _STATIONSTRUCT{
    int stationID;              //站点ID
    QString stationName;        //站点名字
    QString TISStationCode;     //TIS code
    int routeID;                //线路ID
} StationStruct;

//列车内位置结构体
typedef struct _POSITIONINCARSTRUCT{
    int positionID;          //列车内位置ID
    QString positionDes;     //列车内位置描述
} PosInCarStruct;


/*********************************************************

配置模块 中要用到的数据结构

*********************************************************/

//喂狗数据
typedef struct FREEDDOGSTRUCT{
    qint16 time;
    qint16 cpuLimmit;
    qint16 memoryLimmit;
    qint16 hardDiskLimmit;
} FreedDogStruct;

typedef struct AGREEMENT{
    qint64 header; //数据头，固定值：0xFFFA
    qint64 totalBytes; //整个帧长度
    qint64 cmd; //命令
    qint64 bytesWritten; //已经发送数据大小
    qint64 bytesToWrite; //剩余数据大小
    qint64 loadSize; //每次发送数据的大小
    QByteArray dataBytes; //每次发送的数据
    qint64 ender; //帧的结束，固定值: 0xFF
} Agreement;

//文件信息结构体
typedef struct FILEINFOSTRUCT{
    QString fileName; //文件名
    int fileSize; //文件长度
    QDateTime lastModified; //最近修改时间
} FileInfoStruct;



typedef enum{
    TCPNOERR,  //无错误
    CONNERR, //连接失败
    CONNREFUSED, //Connection refused
    SENDDATEERR, //发送数据失败
    UPDATEERR, //更新失败
    NOFILE, //没有文件
    OPENERR, //文件打开失败
    FILEUNFINISH, //文件未下载完成
    OPENFAIL, //文件打开失败
    OTHERERR, //其它错误
}ERRENUM;

class RecePkgManage;

//下载文件相关信息结构体
typedef struct RECEINFOSTRUCT{
    QString fileName; //下载文件名
    QString filePath; //文件完全路径
    QFile *file; //文件结构体
    quint32 fileLen; //文件大小
    quint32 hasReceLen; //已经接收到的文件长度
    int pkgCount; //文件分成数据包总数
    QMap<int, qint64> recePkgMap; //已经接收文件数据包(包编号, 位置)
    RecePkgManage *recePkgmange; //收到数据包管理
    bool isFinish; //是否已经下载完成
    ERRENUM enmErr; //错误信息
    int tryDLCount; //出错或者丢失包尝试下载次数
    QTimer *DLTimer; //下载等待时间
} ReceInfoStruct;

//下载信息结构体
typedef struct DOWNLOADINFO{
    QString fileName;
    bool isFinish;
    ERRENUM enumErr;
    int hasReceLen;
    int row;
    int fileSize;
    QDateTime dateTime;
} DownLoadInfo;

//系统状态结构体
typedef struct SYSTEMSTATE{
    int cpuOccRate;
    int memOccRate;
    int hardDiskOccRate;
} SystemState;


#endif // ENVIRONMENT_H
